import logging
from datetime import datetime

from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.cron import CronTrigger

from app.db.seed_data import async_init_seed_data
from app.db.session_factory import get_async_context_manager

# 创建全局调度器实例
scheduler = AsyncIOScheduler()

async def daily_reset_task():
    """
    每天午夜执行的清空数据并重新初始化的任务
    """
    print(f"{datetime.now()} - 开始执行每日数据重置任务")

    try:
        async with get_async_context_manager() as session:
            # 1. 清空所有表数据（注意顺序，因为有外键约束）
            # 这里需要根据你的实际模型导入相应的表
            from app.models import User, Role, UserRole, Menu, RoleMenu, Region, Api, Dict, DictType,LoginLog, OperationLog

            tables_to_clear = [
                UserRole.__table__,
                RoleMenu.__table__,
                Dict.__table__,
                DictType.__table__,
                Api.__table__,
                Region.__table__,
                User.__table__,
                Role.__table__,
                Menu.__table__,
                LoginLog.__table__,
                OperationLog.__table__,
            ]

            for table in tables_to_clear:
                await session.execute(table.delete())
                await session.commit()

            print(f"{datetime.now()} - 数据清空完成")

            # 2. 重新初始化种子数据
            await async_init_seed_data(session)
            print(f"{datetime.now()} - 种子数据重新初始化完成")

    except Exception as e:
        print(f"{datetime.now()} - 数据重置失败: {str(e)}")
        if 'session' in locals():
            await session.rollback()

def setup_daily_reset_scheduler():
    """
    设置每日数据重置定时任务
    """
    # 配置调度器日志
    logging.getLogger('apscheduler').setLevel(logging.INFO)

    # 每天午夜0点执行
    scheduler.add_job(
        daily_reset_task,
        trigger=CronTrigger(hour=0, minute=0, second=0),  # 每天午夜
        # trigger=CronTrigger(minute='*/2'), # 测试使用，每两分钟执行一次
        id="daily_data_reset",
        name="每日数据重置",
        replace_existing=True
    )